package com.zhxy.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 读取配置文件，获取相关配置参数的值。
 * @author XingNing OU
 */
public final class ConfigUtils {

    private static final Logger LOG = LoggerFactory.getLogger(ConfigUtils.class);

    private static final String CONFIG_FILE = "configuration.properties"; // 配置文件

    private static ReentrantLock lock = new ReentrantLock();

    /**
     * 配置信息。
     */
    private static Properties props;

    /**
     * Private constructor.
     */
    private ConfigUtils() {
    }

    /**
     * 从配置文件中加载配置信息。
     */
    private synchronized static Properties getProps() {
        if (null == props || props.isEmpty()) {
            props = new Properties();
            InputStream inStream = null;

            lock.lock(); // 加锁
            try {
                inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE);
                props.load(inStream);
            } catch (IOException e) {
                LOG.error("An error occurs when loading properties from file {}. Cause: ", CONFIG_FILE, e);
            } finally {
                lock.unlock(); // 解锁

                if (null != inStream) {
                    try {
                        inStream.close();
                    } catch (IOException e) {
                        // Ignore
                    }
                }
            }
        }

        return props;
    }

    /**
     * 获取配置参数的值。
     * @param key 配置参数
     * @return 配置参数的值，如果找不到对应参数则返回<code>null</code>
     */
    public static String getProperty(String key) {
        return getProps().getProperty(key);
    }

    /**
     * 获取配置参数的值，如果找不到则返回默认值。
     * @param key 配置参数
     * @param defaultValue 默认值
     * @return 配置参数的值，如果找不到则返回默认值
     */
    public static String getProperty(String key, String defaultValue) {
        return getProps().getProperty(key, defaultValue);
    }

    /**
     * 获取配置参数的值，如果找不到则返回默认值。
     * @param key 配置参数
     * @param defaultValue 默认值
     * @return 配置参数的值，如果找不到则返回默认值
     */
    public static int getProperty(String key, int defaultValue) {
        String value = getProps().getProperty(key);
        if (null != value) {
            try {
                return Integer.parseInt(value);
            } catch (Exception e) {
                LOG.warn("Retrieve the value of key '{}', but the value is not an integer.", key, e);
            }
        }
        return defaultValue;
    }

}
